#include <iostream>

// 模板 : 数据类型参数化
// 模板的好处 : 减少代码的重复编写
template <typename T>
T add(T a, T b)
{
    return a + b;
}

// 完全通用的代码是不存在的

struct Student
{
    Student(const char* name,int money):name(name),money(money)
    {
        // char name[20];
        // int money;
    }

    const char *name;
    int money;
};

template <typename T>
void Swap(T &a, T &b)
{
    T tmp = a;
    a = b;
    b = tmp;
}

// 模板函数的特化
// 特殊的类型有特殊的处理方式，写了特化版本，编译器不会再为其生成对应类型的模板函数
template <>
void Swap<Student>(Student &s1, Student &s2)
{
    std::cout << "特化的模板函数!\n";
    int m = s1.money;
    s1.money = s2.money;
    s2.money = m;
}
int main()
{

    // //显式调用
    // std::cout << add<int>(1,2) << std::endl;
    // std::cout << add(1.1,2.2) <<std::endl;  //隐式调用
    // //有的时候隐式调用会出问题，需要手动显式调用
    // std::cout << add<std::string>("hello","world") << std::endl;

    Student s1("zhangsan", 500);
    Student s2("lisi", 1000);

    std::cout << s1.name << " " << s1.money << std::endl;
    std::cout << s2.name << " " << s2.money << std::endl;

    std::cout<<std::endl;
    Swap(s1,s2);
    std::cout << s1.name << " " << s1.money << std::endl;
    std::cout << s2.name << " " << s2.money << std::endl;
    return 0;
}